package com.example.gcmtest;

import java.util.ArrayList;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Looper;
import android.util.Log;

import com.example.gcmtest.MarathonDataBase.Convention;
import com.example.gcmtest.MarathonDataBase.MarathonCourseData;
import com.example.gcmtest.MarathonDataBase.MarathonDataBase;
import com.google.android.maps.GeoPoint;

//=================================================================
// GPSを取得し続けるサービス
//=================================================================
public class GPSManagerService extends Service implements LocationListener{

	public double latitude=0;
	public double longitude=0;
	private MarathonDataBase marathonDB; // データベースクラス

	//GeoPoint格納用
	GeoPoint gp_S;
	GeoPoint gp_E;
	GeoPoint gp_P;

	private MarathonCourseData courseData;

	// コース区間番号記憶用
	private int section = 0;



	LocationManager mLocationManager;

	// コンストラクタ
	public GPSManagerService()
	{
		// データベースクラス取得
		marathonDB = MarathonDataBase.getInstance();
//		marathonDB = new MarathonDataBase(this);
	}

	@Override
	public IBinder onBind(Intent intent) {
		// TODO 自動生成されたメソッド・スタブ
		return null;
	}


	// サービス初回起動時処理
	@Override
	public void onCreate() {
		Log.i(CommonUtilities.TAG_GCM, "GPSサービス初回起動");
		new Thread(new Runnable() {
	        @Override
	        public void run() {
				mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
				Looper looper = Looper.getMainLooper();
				mLocationManager.requestLocationUpdates(
						LocationManager.GPS_PROVIDER,
						0,
						0,
						GPSManagerService.this,
						looper);
				// マラソンマップデータの取得

	        }
		}).start();
		courseData = MarathonCourseData.getInstance(getResources());
		// 大会コースデータリストを取得
        ArrayList<Convention> conventionList = courseData.GetConventionList();

        // 大会コースを設定
        // ダミーデータ、今回は先頭(大阪マラソン)を設定する。
        Boolean ret = courseData.SetConvention(conventionList.get(0).No);
	}

	// 再度サービスが呼ばれた時の処理
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		Log.i(CommonUtilities.TAG_GCM, "GPSサービス通常起動");
		Log.i(CommonUtilities.TAG_GCM, "緯度:"+ latitude + "経度:" + longitude);

		return START_STICKY;
	}

	// サービス終了時の処理
	@Override
	public void onDestroy() {
		Log.i(CommonUtilities.TAG_GCM, "GPSサービス終了");
	}

	// 位置情報が変更された時に呼び出される
	@Override
	public void onLocationChanged(Location location) {
		Log.i(CommonUtilities.TAG_GCM,"LocationOK");

		//緯度の取得
		latitude = (double) (location.getLatitude());
		//経度の取得
		longitude = (double) (location.getLongitude());


		// ダミークラスからGeoPoint値を取得する
		gp_S = courseData.GetCourseData(section);
		gp_E = courseData.GetCourseData(section + 1);
		gp_P = new GeoPoint((int)(latitude*1E6), (int)(longitude*1E6));



		Log.i(CommonUtilities.TAG_GCM,"gp_S:" + gp_S + "gp_E:" + gp_E + "gp_P:"+ gp_P);

		// GPS取得値補正処理
		/* コンストラクタ呼出 */
		CalcPos CalcPos = new CalcPos();
		/* 値を取得して表示します。 */
		String latlon = CalcPos.resultPosition(gp_S, gp_E, gp_P);

		// Stringから緯度経度を抜き出す
		String[] array_msg = latlon.split(",");
		latitude = Double.parseDouble(array_msg[0]);
		longitude = Double.parseDouble(array_msg[1]);

		/*******************************************************************/
        // コーナーから10m以内なら、次の区間の開始とするで表示する
        CalcDistance CalcDis = new CalcDistance();
        /* 値を取得して表示します。 */
        double DistancePtoE = CalcDis.distance_atob(latitude, longitude, courseData.GetCourseDataLatitude(section + 1), courseData.GetCourseDataLangitude(section + 1), 'K');
		if(10 >= DistancePtoE){
			section++;
		}
		/*******************************************************************/


		//=====================================================================
		// 位置情報永久化
		//=====================================================================
		marathonDB.setText("LATITUDE",Double.toString(latitude));
		marathonDB.setText("LONGITUDE",Double.toString(longitude));
	}

	@Override
	public void onProviderDisabled(String provider) {

	}
	@Override
	public void onProviderEnabled(String provider) {

	}
	@Override
	public void onStatusChanged(String provider, int status, Bundle extras) {
		switch (status) {
		case LocationProvider.AVAILABLE:
			Log.v("Status", "AVAILABLE");
			break;
		case LocationProvider.OUT_OF_SERVICE:
			Log.v("Status", "OUT_OF_SERVICE");
			break;
		case LocationProvider.TEMPORARILY_UNAVAILABLE:
			Log.v("Status", "TEMPORARILY_UNAVAILABLE");
			break;
		}
	}
}
